package org.example.java.jvm.error;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
 * VM Args： -XX:PermSize=10M -XX:MaxPermSize=10M
 * Method Area 内存溢出
 * <p/>
 * 也就是 Non-heap，是用来存储 Object Class Data、常量、静态变量、JIT 编译后的代码等。
 * 如果该区域溢出，则说明某种数据创建的实在是太多了。
 * 模拟的话，可以不断创建新的 class，直到溢出为止。
 * run result:
 * Caused by: java.lang.OutOfMemoryError: PermGen space
 * at java.lang.ClassLoader.defineClass1(Native Method)
 */
public class JavaMethodAreaOOM {
  static class MethodAreaOomObject {
  }

  //CGLIB(Code Generation Library)是一个开源项目！
  //是一个强大的，高性能，高质量的Code生成类库，它可以在运行期扩展Java类与实现Java接口。
  public static void main(String[] args) {
    while (true) {
      Enhancer enhancer = new Enhancer();
      enhancer.setSuperclass(MethodAreaOomObject.class);
      enhancer.setUseCache(false);
      enhancer.setCallback(new MethodInterceptor() {
        public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
          return proxy.invoke(obj, args);
        }
      });
      enhancer.create();
    }
  }
}
